package br.usjt.mazerobot.comunicacao;

import br.usjt.mazerobot.commons.comunicacao.Encoder;
import br.usjt.mazerobot.commons.comunicacao.Pacote;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.logging.Level;

public class ComunicadorSocket implements Comunicador {

    private String IP_DESTINO = "localhost";
    private final int PORTA_ENTRADA = 3000;
    private final int PORTA_SAIDA = 2000;
    
    DatagramSocket datagramSocket;
    byte[] buf;
    DatagramPacket datagramPacket;

    public ComunicadorSocket() {
        try {
            datagramSocket = new DatagramSocket(PORTA_ENTRADA);
            buf = new byte[16];
            datagramPacket = new DatagramPacket(buf, buf.length);
        } catch (SocketException ex) {
            java.util.logging.Logger.getLogger(ComunicadorSocket.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void desconectar() {
        enviarLog("desconectando...");
    }

    @Override
    public void enviar(Pacote pacote) {
        try {
            DatagramSocket datagramSocketOutput = new DatagramSocket();
            InetAddress inetAddress = InetAddress.getByName(IP_DESTINO);
            DatagramPacket datagramPacketOutput = new DatagramPacket(pacote.getDados(), pacote.getDados().length, inetAddress, PORTA_SAIDA);
            datagramSocketOutput.send(datagramPacketOutput);
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
        }

    }

    @Override
    public Pacote receber() {
        try {
            datagramSocket.receive(datagramPacket);
            Pacote pacote = (Pacote) new Pacote(datagramPacket.getData());
            return pacote;

        } catch (IOException ex) {
            enviarLog(ex.getMessage());
        }
        return null;
    }

    @Override
    public void enviarLog(String log) {
        Encoder encoder = new Encoder();
        Pacote[] pacotes = encoder.codificar(log);
        
        for(Pacote p : pacotes){
            enviar(p);
        }
    }

    @Override
    public void aguardarConexao() {
        
    }
}
